package com.entrogy.timing;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimeUtils {
	private SimpleDateFormat sfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private SimpleDateFormat sfDate = new SimpleDateFormat("yyyy-MM-dd");
	private SimpleDateFormat sfTime = new SimpleDateFormat("HH:mm:ss");

	// 获取当前的年月日时分秒
	public String getCurrentDateTime() {
		Date curDate = new Date();
		return sfDateTime.format(curDate);
	}

	// 获取当前的年月日时分秒
	public String getDateTime(Date date) {
		return sfDateTime.format(date);
	}

	// 获取当前的年月日
	public String getCurrentDate() {
		Date curDate = new Date();
		return sfDate.format(curDate);
	}

	// 获得给定时间是周几
	public int getWeekNum(String date) throws ParseException {
		Calendar cal = Calendar.getInstance();
		Date theDate = sfDate.parse(date);
		cal.setTime(theDate);
		// 1是星期日、2是星期一、3是星期二、4是星期三、5是星期四、6是星期五、7是星期六
		int n = cal.get(Calendar.DAY_OF_WEEK);
		// 更符合逻辑
		return n == 1 ? 7 : n - 1;
	}

	// 根据时分秒获得时间
	public Date getHourMinuteDate(int hour, int minute, int second) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, hour);
		calendar.set(Calendar.MINUTE, minute);
		calendar.set(Calendar.SECOND, second);
		return calendar.getTime();
	}

	// 增加或减少天数
	public Date addDay(Date date, int day, int hour, int minute) {
		Calendar startDT = Calendar.getInstance();
		startDT.setTime(date);
		startDT.add(Calendar.DAY_OF_MONTH, day);
		startDT.add(Calendar.HOUR_OF_DAY, hour);
		startDT.add(Calendar.MINUTE, minute);
		return startDT.getTime();
	}

	// 定时任务的开始时间
	public Date getStartDate(int hour, int minute, int second) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, hour);
		calendar.set(Calendar.MINUTE, minute);
		calendar.set(Calendar.SECOND, second);
		Date date = calendar.getTime(); // 第一次执行定时任务的时间
		// 如果第一次执行定时任务的时间 小于 当前的时间，此时要在 第一次执行定时任务的时间 加一天，以便此任务在下个时间点执行。如果不加一天，任务会立即执行。
		if (date.before(new Date())) {
			date = this.addDay(date, 1, 0, 0);
		}
		return date;
	}

	// 已知时分秒转成string
	public String getStringTime(int hour, int minute, int second) {
		Date date = getHourMinuteDate(hour, minute, second);
		return sfTime.format(date);
	}
}

